package 剑指offer;

public class 剑指Offer16数值的整数次方 {
    public double myPow(double x, int n) {

        if (Math.abs(x) == 1 && Math.abs(n) % 2 == 0){//如果x的绝对值为1，n为偶数，那么结果一定为1
            return 1;
        }
        if (Math.abs(x) == 1 && Math.abs(n) % 2 == 1){//如果x绝对值为1，n为奇数，那么结果一定为x；
            return x;
        }
        return n > 0 ? pow(x,-n) : pow(x,n);//将n全部转为负数，转为正数会超过最大值
    }

    private double pow(double x, int n) {
        double res = 1.0;
        if (n == 0) return  1;
        if (n == -1) return 1/x;//全部转为负数，如果为-1，返回x的倒数
        res = res * pow(x,n/2);//这里每次/2，防止递归溢出，2的4次方 = 2 的平方 * 2 的平方
        return n % 2 == -1 ? res * res / x : res * res;//如果n为奇数，那么就要多*一次1/x,偶数正常
    }
}
